S3へのリクエストをHTTPSのみ許可できるか検証してみた

S3へのリクエストをHTTPSのみ許可できるか検証してみた

S3へのリクエストをHTTPSのみ許可したい場合は、バケットポリシーの aws:SecureTransport で設定できます。
Clock Icon2021.10.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!コンサル部のinomaso(@inomasosan)です。

S3のバケットポリシーを調べていた際に以下のAWSナレッジを見つけました。

今回は、実際にS3のバケットポリシーを設定して、HTTPSリクエストのみを許可できるかAWS CLIで確認していきます。

まずは結論

HTTPS(HTTP over SSL/TLS)を強制するためには、S3バケット毎のバケットポリシーを設定する必要があります。
また、上記設定が有効化されている確認も必要となるので、中々に運用が大変です。

デフォルトだと、ほとんどのリクエストはHTTPSが使用されます。
そのため、個人情報等の重要な情報が保管されているバケットに対してのみ、設定するのが良いかと思います。

環境

今回実行した環境は以下の通りです。

  • macOS Big Sur 11.6
  • AWS CLI 2.2.35

前提

S3へのリクエストの仕様は、AWSナレッジに記載されていました。

Amazon S3 は HTTP リクエストと HTTPS リクエストの両方を許可します。デフォルトでは、リクエストは AWS マネジメントコンソール、AWS コマンドラインインターフェイス (AWS CLI)、または HTTPS を介して行われます。

やってみた

検証用S3バケット作成

S3バケットをデフォルト設定で作成し、バケットポリシーにHTTPリクエストを明示的に拒否するポリシーを設定します。

{
  "Id": "ExamplePolicy",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowSSLRequestsOnly",
      "Action": "s3:*",
      "Effect": "Deny",
      "Resource": [
        "arn:aws:s3:::<バケット名>",
        "arn:aws:s3:::<バケット名>/*"
      ],
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "false"
        }
      },
      "Principal": "*"
    }
  ]
}

テストファイル準備

S3バケットに検証用のファイルを用意します。
今回はAWS CLIで検証するので、S3バケットへの検証用のファイルアップロードもコマンドで実施していきます。

以下のコマンドで、ローカル端末に検証用のファイルを作成し、S3バケットにアップロードします。
※デフォルトはHTTPSリクエストなので、以下のコマンド実行は特に問題ありません。

% touch test.txt
% aws s3 cp test.txt s3://<バケット名>/
upload: ./test.txt to s3://<バケット名>/test.txt
%
% aws s3 ls s3://<バケット名>/
2021-10-20 14:17:56          0 test.txt

HTTPSリクエスト確認

明示的なHTTPSリクエスト確認をする場合は、--endpoint-urlオプションで、コマンドのデフォルトエンドポイントURLを上書きします。
今回は東京リージョンにS3を作成したのでhttps://s3.ap-northeast-1.amazonaws.comと指定しています。

以下のコマンドで、先ほどアップロードしたファイルを問題なく参照できました。

aws s3 ls s3://<バケット名>/ --endpoint-url https://s3.ap-northeast-1.amazonaws.com

2021-10-20 14:17:56          0 test.txt

HTTPリクエスト確認

HTTPSリクエストと同様に--endpoint-urlオプションで、コマンドのデフォルトエンドポイントURLを上書きします。
HTTPでリクストするためhttp://s3.ap-northeast-1.amazonaws.comと指定しています。

以下のコマンドで、HTTPリクエストの場合Access Deniedされることがわかりました。

% aws s3 ls s3://<バケット名>/ --endpoint-url http://s3.ap-northeast-1.amazonaws.com

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

TLSのバージョンで細かい制御できないの?

いい感じのブログがあったので、こちらをご参照ください。

参考URL

まとめ

今回の検証にあたり梶原裕に色々とアドバイスを貰いました。改めてありがとうございます。

この記事が、どなたかのお役に立てば幸いです。それでは!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.